Fundamental Drawing Algorithms in Computer Graphics - Chapter 4 - [Part 2]

مقدمة
  • ده الجزء التاني من الشابتر، وهنركز فيه على Circle Drawing Algorithms.
  • هنستعرض أكتر من طريقة لرسم الدواير: من المعادلة المباشرة (Circle Equation) اللي بسيطة بس فيها مشاكل، للخوارزميات الأذكى واللي مش محتاجة كسور أو جذور زي Midpoint و Bresenham.
  • هنفهم كمان مفهوم Eight-Way Symmetry اللي بيخلينا نوفر 7 أضعاف الحسابات.
  • في الآخر هيكون عندنا مقارنة كاملة بين كل الخوارزميات عشان تعرف تختار الأنسب.

1) Circle Drawing Algorithms

  • بما إن الشاشات بتاعتنا Raster displays (عباره عن Grid يعني)، فإحنا محتاجين خوارزميات تقرب الشكل الدائري المتصل ده لمجموعة بيكسلات منفصلة (Discrete pixels) بكفاءة عالية.
  • عشان الدائرة شكل متماثل جدا، معظم الخوارزميات بتستغل حاجة اسمها الـ Eight-way symmetry (التماثل الثماني).
  • يعني بدل ما نحسب محيط الدائرة كله، إحنا بنحسب تمن واحد بس (1/8 من الدائرة)، وبنعكس النقط دي على باقي الأثمان عشان نقلل الحسابات.

2) Circle Equation Method

Concept of Circle

definition

A circle is specified by its center (xc, yc) and radius r.

  • أبسط طريقة نرسم بيها الدائرة هي إننا نستخدم معادلتها الرياضية. الدائرة في مستوى الإحداثيات بتتعرف بحاجتين:

    • نقطة المركز: (Xc, Yc)
    • نصف القطر: r
  • معادلة الدائرة القياسية:

  • الدائرة هي كل النقط اللي بعدها عن المركز ثابت، والمسافة الثابتة دي اسمها Radius.

Direct Use of the Circle Equation (The Key Idea)

  • الفكرة هنا إننا نمشي خطوة خطوة على محور السينات بداية من أقصى الشمال لحد أقصى اليمين، وفي كل خطوة نحسب قيمة الصادات اللي تقابلها.
    • نقطة البداية على الـ هتبقى:
    • نقطة النهاية على الـ هتبقى:
  • بنمشي بـ Unit increments (يعني بنزود الـ بمقدار 1 في كل خطوة).
عشان نحسب الـ ، بنستخدم المعادلة دي:

  • إشارة الـ دي بتطلعلي قيمتين للـ لكل قيمة (قيمة موجبة ترسم الـ Upper semicircle وقيمة سالبة ترسم الـ Lower semicircle)، عشان كده الدائرة بتترسم كاملة فوق وتحت.

Steps

  1. السؤال هيديلك المركز (xc, yc) ونصف القطر r.
  2. بنعمل Loop لكل قيمة X من أول Xc - r لحد Xc + r.
  3. احسب:

  1. ارسم النقطتين الناتجين.
  2. ممكن تستخدم symmetry عشان تقلل الحسابات.

Special Case: Center at Origin

  • حالة خاصة وبسيطة جداً، لو كان مركز الدائرة هو نقطة الأصل (0, 0). ساعتها مش محتاجين نطرح Xc ولا Yc، والمعادلة بتتبسط وتبقى شكلها كده:

Advantages

  • سهلة في الفهم والتنفيذ.

Disadvantages

  • بتستخدم Floating-point operations (عمليات الكسور العشرية)، ودي تقيلة جداً وبطيئة على البروسيسور.
  • ا Not suitable for real-time rendering: مينفعش نستخدمها في ألعاب أو حاجات محتاجة فريمات سريعة لانها بطيئة.
  • الحسابات بتاعتها مش Efficient خالص، لأنها بتعتمد على عمليات الضرب (عشان نجيب التربيع) وعملية الـ Square root (الجذر التربيعي) اللي بنحاول نتجنبها على قد ما نقدر في الجرافيكس لأنها بطيئة جداً.
  • ا Large gaps: بتعمل فراغات كبيرة في الرسمة لما يكون ميل الخط قريب من الرأسي (ودي هنشرحها بالتفصيل في جزء الـ Output)

مثال من كراسة العملي علي Direct Circle Equation

عايزين نرسم دائرة مركزها (0,0) ونصف قطرها r = 5 باستخدام معادلة الدائرة الأساسية (Direct Equation).

Step 1: Initial Calculations

  • أول حاجة بنعملها إننا بنجهز المعادلة بتاعتنا بناء على المركز ونصف القطر اللي معانا، عشان نستنتج قيمة الـ y.
  • المعادلة القياسية للدايرة:

  • بما إن المركز بتاعنا هو نقطة الأصل (0,0) (Special Case)، المعادلة هتتبسط وتبقى:

  • حساب الـ y:
    • هنودي الـ y في طرف لوحدها عشان دي اللي هنحسبها لكل بيكسل:

  • تحديد اتجاه اللوب (Condition):

  • هنعمل Loop على الـ x بداية من أقصى الشمال () لحد أقصى اليمين (). بس عشان التبسيط في الجدول بتاعنا، خلينا نمشي على الربع الأول بس (من 0 لـ 5) ونشوف النقط الموجبة.

Step 2: Iterative Table

  • هنا بقى هنمسك قيم الـ x من أول 0 لحد 5، وفي كل مرة نعوض في المعادلة بتاعتنا عشان نجيب قيمة الـ y.

  • وطبعا عشان دالة الـ Square root بتطلع أرقام عشرية (Floating-point)، لازم نعمل Rounding (نقرب) في الخر عشان نجيب الـ Pixel الصح.

Step x (Loop variable) y (Calculated: 25−x2​) Pixel (after rounding)
0 0 (0, 5)
1 1 (1, 5)
2 2 (2, 5)
3 3 (3, 4)
4 4 (4, 3)
5 5 (5, 0)

Final Pixels (الربع اليمين اللي فوق):

(0,5), (1,5), (2,5), (3,4), (4,3), (5,0)

Chat GPT Image May 29 2026 07 30 56 PM

Output

image

  • لما تعمل Run للكود ده وتشوف النتيجة (زي الصورة)، هتلاحظ حاجة غريبة :

    • من فوق ومن تحت (Top and bottom edges): الدائرة طالعة ناعمة ومظبوطة (Smooth).
    • من اليمين ومن الشمال (Left and right sides): الدائرة فيها فراغات واضحة جداً تحسها متقطعة (Noticeable gaps).
  • ليه ده بيحصل؟

    • الفكره في الـ Discrete nature of the pixel grid (طبيعة الشاشة المتقطعة).
    • لما بنقرب من أقصى اليمين أو أقصى الشمال، ميل الدائرة (Slope) بيبقى رأسي جدا. ده معناه إن مع كل خطوة صغيرة بنمشيها على الـ X، قيمة الـ Y بتتغير برقم كبير جدا.
    • ولأننا بنمشي بمقدار 1 بيكسل بس على الـ Xوبنعمل Rounding، الالجورزم بتفوت بيكسلات كتير بالطول ومبترسمهاش، فبيطلع الشكل متقطع ومفيش نقط كفاية تغطي المنطقة دي.
    • عشان كده، الحل ده مش عملي وبنلجأ لحلول تانية زي الـ Midpoint Circle Algorithm اللي هتحل المشكلة دي تماماً. لو جاهز ندخل عليها، دوس!

3) Eight-Way Symmetry

definition

Eight-way symmetry means a circle can be divided into eight identical octants, and one computed point can generate seven other symmetric points.

  • عشان نخلي الخوارزمية بتاعتنا Efficient (سريعة وفعالة)، أول حاجة لازم نلاحظها إن الدائرة اللي مركزها نقطة الأصل (0, 0) ليها تماثل ثماني الأبعاد. الـ Optimization ده بيوفر علينا عمليات حسابية متكررة ملهاش لازمة (Redundant calculations).
  • امتى نقول على شكل إنه متماثل؟ لو قدرنا نعمله تحويلات (زي الدوران أو الانعكاس) وفضل شكله زي ما هو متغيرش.

Reflection and Rotation

  • الدايرة بقى بالذات ليها Infinite rotational symmetry (تماثل دوراني لا نهائي)، يعني مهما لفيتها بأي زاوية، هتفضل شكلها دائرة.
  • يعني إحنا نقدر نقسم الدائرة لـ 8 حتت متساوية (كانها بيتزا 🍕 ) بخطوط بتترسم كل 45 درجة (عند 0°، 45°، 90°، 135°، وهكذا).
  • كل حتة من التمانية دول متطابقة تماما مع الباقيين. يعني لو حسبنا ورسمنا تمن واحد بس (1/8)، نقدر نعكسه ونلفه عشان نجيب الـ 7 أتمان الباقيين ببلاش من غير حسابات معقدة.

Symmetric Points

  • كل تمن من الـ 8 أتمان بنسميه Octant. لو إحنا حسبنا نقطة واحدة بس اسمها موجودة على محيط الدائرة في الـ Octant الأول، نقدر نستنتج الـ 7 نقط الباقيين بمجرد إننا نبدل الـ مكان الـ أو نغير الإشارات بتاعتهم (موجب وسالب).
Symmetry Point Belongs To Operation
Octant 1 النقطة الأصلية اللي حسبناها
Octant 2 بدلنا السينات والصادات
Octant 3 بدلنا وغيرنا إشارة السين
Octant 4 النقطة الأصلية بس السين سالبة
Octant 5 النقطة الأصلية بس الاتنين سوالب
Octant 6 بدلنا والاتنين سوالب
Octant 7 بدلنا وغيرنا إشارة الصاد
Octant 8 النقطة الأصلية بس الصاد سالبة

  • افرض إن الالجورزم بتاعتنا (بعد ما عملت حساباتها المعقدة) طلعت نقطة واحدة بس في التمن الأول وهي (2, 7) ، يعني الـ X = 2 والـ Y = 7.

  • بدل ما الالجورزم تحسب باقي الدائرة، هتاخد النقطة دي وتطبق عليها الجدول اللي فوق عشان ترسم 8 بيكسلات في نفس اللحظة:

    • النقطة في Octant 1 هتبقى:
    • النقطة في Octant 2 هتبقى:
    • النقطة في Octant 3 هتبقى:
    • النقطة في Octant 4 هتبقى:
    • النقطة في Octant 5 هتبقى:
    • النقطة في Octant 6 هتبقى:
    • النقطة في Octant 7 هتبقى:
    • النقطة في Octant 8 هتبقى:

مثال من كراسة العملي علي Eight-Way Symmetry

لو استخدمنا الجورزم وحسبنا اول نقطة في التمن الاول لدائرة مركزها (0,0)، والنقطة دي (4, 3). عايزين نجيب الـ 7 نقط المتماثلة معاها في باقي الدائرة من غير ما نحسب معادلة الدائرة من أول وجديد.

Step 1: Initial Calculations

أول حاجة بنعملها إننا بنجهز قواعد الانعكاس (Reflection rules) اللي الخوارزمية بتبرمجها. إحنا عارفين إن الدائرة متماثلة في الـ 8 أثمان.

لو النقطة الأساسية هي x = 4 و y = 3:

  • عشان نروح للتمن اللي جنبه، بنعكس الـ x مكان الـ y.
  • عشان نروح للنص الشمال، بنخلي السينات بالسالب.
  • عشان نروح للنص اللي تحت، بنخلي الصادات بالسالب.

Step 2: Iterative Table (جدول التماثل الثماني)

هنا بقى الخوارزمية بتمسك النقطة اليتيمة اللي حسبتها (4, 3)، وتطبق عليها الـ 8 قواعد في نفس اللفة عشان تنور 8 بيكسلات مرة واحدة:

Octant Symmetry Rule Calculation (x=4, y=3) Pixel to Plot
Octant 1 (x, y) (4, 3) (4, 3)
Octant 2 (y, x) (3, 4) (3, 4)
Octant 3 (-y, x) (-3, 4) (-3, 4)
Octant 4 (-x, y) (-4, 3) (-4, 3)
Octant 5 (-x, -y) (-4, -3) (-4, -3)
Octant 6 (-y, -x) (-3, -4) (-3, -4)
Octant 7 (y, -x) (3, -4) (3, -4)
Octant 8 (x, -y) (4, -3) (4, -3)

Final Pixels:

(4,3), (3,4), (-3,4), (-4,3), (-4,-3), (-3,-4), (3,-4), (4,-3)

Chat GPT Image May 29 2026 07 50 37 PM

4) Midpoint Circle Algorithm

definition

Midpoint Circle Algorithm is an efficient circle drawing algorithm that uses decision parameters to choose the next pixel.

  • الالجورزم دي بتعتبر من أكفأ الطرق عشان نرسم بيها دوائر من غير الفراغات اللي شفناها قبل كده. فكرتها إنها بتيجي بين بيكسلين محتملين (واحد أفقي وواحد قطري (بالورب))، وتحسب نقطة الـ Midpoint (نقطة المنتصف) بينهم، وتشوف خط الدائرة الحقيقي أقرب لأنهي بيكسل فيهم عشان تنوره.

Key Idea

  • ا Symmetry of Circles: بنستغل الـ 8-way symmetry الي اتكلمنا عنها قبل كده عشان نحسب تمن واحد بس (1/8) ونعكسه 7 مرات.
  • ا Decision Parameter: بنستخدم معامل قرار عشان نحدد البيكسل الصح اللي عليه الدور.
  • ا Integer Arithmetic: الميزة هنا إننا بنتجنب الـ Floating-point (الكسور) والـ Roots (الجذور) خالص، وكل حساباتنا بتبقى أرقام صحيحة، فبتبقى Computationally efficient (سريعة جداً للبروسيسور).

Steps

  1. بنبدأ بنقطة المركز (X0, Y0) ونصف القطر r.
  2. ا Initialize variables:
    • بندي قيم ابتدائية للمتغيرات بتاعتنا للتمن الأول:
x = 0
y = r
  • بنحسب الـDecision Parameter:
decision parameter = 1 - r
  1. بنعمل Plot لأول نقطة وبنستخدم الـ Symmetry عشان نرسم الـ 8 نقط المتماثلين.
  2. في كل خطوة، بنحدث الـ Decision parameter وبناءً عليه بنقرر: هل نزود الـ بس؟ ولا نزود الـ وننقص الـ ؟

مثال من كراسة العملي علي Midpoint Circle Algorithm

عايزين نرسم دائرة مركزها (0,0) ونصف قطرها r = 5 باستخدام معادلة الدائرة الأساسية (Direct Equation).

Step 1: Initial Calculations

عشان نقدر نعمل جدول trace صغير، خلينا ناخد مثال مصغر من النقط اللي في الكود:

  • مركز الدائرة: (0, 0)
  • نصف القطر (): 5

تجهيز الخوارزمية:

  • بنبدأ من أول نقطة خالص فوق خالص وهي نقطة البداية: x = 0 و y = r = 5.
  • بنحسب قيمة الـ decision_param من القانون:
  • الـ Loop بتاعنا هيفضل شغال طول ما قيمة x < y.
متتخضش

Step 2: Iterative Table (تتبع الثُمن الأول Octant 1)

  • هنا بقى الالجورزم بتشوف قيمة الـ Pkفي كل لفة عشان تاخد القرار.
Step Current (x, y) decision_param (Pk) Decision (p >= 0?) Calculation for next Step Symmetric points (نقط الدائرة كلها)
0 (0, 5) (P0) , p = -4 + 2(1) + 1 = -1 (0,5), (0,-5), (5,0), (-5,0), (0,5), (0,-5), (5,0), (-5,0)
1 (1, 5) , p = -1 + 2(2) + 1 = 4 (1,5), (-1,5), (1,-5), (-1,-5), (5,1), (-5,1), (5,-1), (-5,-1)
2 (2, 5) , p = 4 + 2(3-4) + 1 = 3 (2,5), (-2,5), (2,-5), (-2,-5), (5,2), (-5,2), (5,-2), (-5,-2)
3 (3, 4) , p = 3 + 2(4-3) + 1 = 6 (3,4), (-3,4), (3,-4), (-3,-4), (4,3), (-4,3), (4,-3), (-4,-3)
4 (4, 3) (Loop condition x < y stops here) (الـ x بقت 4 والـ y بقت 3، يعني اللوب خلص)
Chat GPT Image May 29 2026 07 53 24 PM

5) Bresenham's Circle Algorithm

definition

Bresenham's Circle Algorithm Similar to the Midpoint algorithm but uses integer arithmetic exclusively, making it faster and more efficient for hardware implementation.

  • اBresenham عمل خوارزمية للدوائر زي ما عمل للخطوط بالظبط. شبه الـ Midpoint بس متظبطة أكتر بحيث إن كل عملياتها تكون جمع وطرح وضرب في أرقام صحيحة بس، وده بيخليها سريعه جدا.

Key Idea

  • بتستخدم الـ Symmetry برده عشان تقلل الحسابات.
  • بتحسب حاجة اسمها Error term (نفس فكرة الـ Decision parameter) عشان تقرر إحنا هنمشي أفقي (Increment x) ولا قطري (بالورب) (Decrement y).

Steps

  • ا Initialize:
x = 0
y = r
  • اDecision parameter بنرمزله بـ d وبنحسبه كده:
d = 3 - 2r
  • ا While loop: طول ما X <= Y (يعني لسه مخلصناش التمن الأول بتاع الدائرة):
  • بنعمل Plot (رسم) للـ 8 نقط المتماثلين حوالين المركز (Cx, Cy).
  • ا If d < 0: ده معناه إننا هنمشي أفقي (Move horizontally):
x = x + 1
  • بنحدث معامل القرار:
d = d + 4x + 6
  • ا Else: ده معناه إننا هنمشي قطري (Move diagonally):
x = x + 1
y = y - 1
  • بنحدث معامل القرار:
d = d + 4(x - y) + 10

مثال من كراسة العملي علي Bresenham's Circle Algorithm

عايزين نرسم دايرة مركزها (0,0) ونصف قطرها r = 5 باستخدام Bresenham's Circle Algorithm.

Step 1: Initial Calculations

أول حاجة بنجهز المتغيرات بتاعتنا قبل ما ندخل في الـ Loop:

  • نقطة البداية: و .

  • بنحسب قيمة الـ Decision Parameter من قانون Bresenham d = 3 - 2r:

  • الكود بيرسم أول 8 نقط متماثلة بناءً على النقطة (0, 5).

  • شرط الدوران (Condition): الـ Loop بيفضل شغال طول ما x≤y.

Step 2: Iterative Table ( Octant 1)

  • جوه الـ Loop، الخوارزمية بتزود الـ x بمقدار 1 الأول، وبعدين تبص على إشارة الـ d عشان تقرر هتقلل الـ y ولا لأ، وتحسب الـ d الجديدة بناءً على النقط الجديدة.
Step Condition (x≤y) Current d Decision (d<0?) New x,y (Pixel) New d Calculation (using new x,y)
0 Before Loop - - (0, 5) d=−7
1 0≤5 (True) −7 Yes (d<0) x=1,y=5 (1, 5) d=−7+4(1)+6=3
2 1≤5 (True) 3 No (d≥0) x=2,y=4 (2, 4) d=3+4(2−4)+10=5
3 2≤4 (True) 5 No (d≥0) x=3,y=3 (3, 3) d=5+4(3−3)+10=15
4 3≤3 (True) 15 No (d≥0) x=4,y=2 (4, 2) d=15+4(4−2)+10=33
5 4≤2 (False) - - - Loop Stops
  • النقط اللي طلعت من الكود ده للربع الأول هي: (0,5), (1,5), (2,4), (3,3), (4,2).
Chat GPT Image May 29 2026 08 10 00 PM

6) Parametric Circle Drawing Algorithm

definition

Parametric Circle Drawing Algorithm uses trigonometric functions ( and ) to calculate the coordinates of the circle. While simple, it is computationally expensive due to the use of floating-point operations.

  • دي طريقة مختلفه بتعتمد على الدوال المثلثية اللي أخدناها في الرياضة.
  • سهلة في الفهم، بس مكلفة حسابيا عشان بتستخدم floating-point operations.

Parametric Equation

  • بنستخدم الـ Parametric equation بتاعت الدائرة، اللي بتجيب الإحداثيات عن طريق زاوية اسمها
x = x0 + r cos(θ)
y = y0 + r sin(θ)
  • بنعمل Loop ونزود الزاوية من لحد (يعني لفة كاملة 360 درجة) عشان نولد كل النقط بتاعت الدائرة.

How It Works

  1. خزن center (x0, y0) و radius r.
  2. خلي θ تتحرك من 0 لـ .
  3. لكل قيمة θ، احسب x و y.
  4. ارسم النقطة الناتجة.

Disadvantage

  • استخدام sin, cos, و floating-point operations بيخليها أبطأ من integer-based algorithms.

مثال من كراسة العملي علي Parametric Circle Drawing Algorithm

عايزين نرسم دايرة مركزها (0,0) ونصف قطرها r = 5 باستخدام معادلة الدائرة الأساسية (Direct Equation).

Step 1: Initial Calculations

  • المعادلة البارامترية (Parametric equation) للدائرة بتعتمد على زاوية الدوران (ثيتا). القوانين اللي هنعوض فيها هي:

بما إن المركز (0,0)، القوانين هتبقى:

الـ Loop بتاعنا بيلف على الزوايا من لحد .

Step 2: Iterative Table (تتبع بعض زوايا الربع الأول)

عشان منطولش الجدول بـ 360 خطوة، خلينا نمسك شوية زوايا مميزة في الربع الأول (من 0 لـ 90 درجة) ونشوف النقط بتتحسب إزاي:

Step Angle (θ∘) Radian (rad) Calculated x (5⋅cos(θ)) Calculated y (5⋅sin(θ)) Pixel (after rounding)
1 (5, 0)
2 (4, 3)
3 (4, 4)
4 (3, 4)
5 (0, 5)
  • زي ما إنت شايف، الطريقة دي بتجيب النقط بشكل مباشر من غير ما تعتمد على النقطة اللي قبلها، وده اللي بيخليها مختلفة عن الـ Incremental Algorithms زي (DDA أو Bresenham).
Chat GPT Image May 29 2026 08 24 58 PM

7) Quick Comparison Between Drawing Algorithms

Algorithm Used For Main Idea Strength Weakness
Direct Line Equation Lines Use y = mx + c سهل جدا Floating-point و rounding errors
DDA Lines Increment x و y step by step بسيط وأسرع من direct equation Floating-point و cumulative errors
Bresenham Line Lines Decision parameter with integers سريع و efficient محتاج فهم أكتر للـ decision updates
Circle Equation Circles Solve circle equation for y سهل ومباشر Square root و gaps عند الأطراف
Midpoint Circle Circles Decision parameter + symmetry efficient وبيقلل الحسابات خطواته أعمق من equation method
Bresenham Circle Circles Integer decision updates + symmetry سريع ومناسب للهاردوير تفاصيل update محتاجة تركيز
Parametric Circle Circles Use sin و cos بسيط رياضيا Trigonometric functions مكلفة

8) ملخص الجزء الثاني

كده خلصنا الجزء التاني

اتكلمنا في الجزء ده عن Circle Drawing Algorithms - إزاي الكمبيوتر بيسوي Rasterization ويحول الدوائر الرياضية لـ Pixels على الشاشة.

عرفنا 5 طرق لرسم الدواير:

  • Circle Equation Method - سهل ومباشر بس فيه Square Root و Gaps كبيرة
  • Eight-Way Symmetry - إن الدائرة ليها 8 Octants متماثلة، فبنحسب نقطة واحدة ونطلع 7 نقط تانية
  • Midpoint Circle Algorithm - بيعتمد على Decision Parameter و Symmetry، بيحل مشكلة الـ Gaps
  • Bresenham's Circle Algorithm - Integer-Based ومناسب للـ Hardware
  • Parametric Circle - بيستخدم sin و cos، سهل فهمه بس أبطأ